<?php
/**
 * Created by PhpStorm.
 * User: s.utkin
 * Date: 03.09.14
 * Time: 20:08
 */

namespace Messenger\Workers;


use Messenger\Groups;
use Messenger\Messages;
use Messenger\Queue\Worker;
use NotificationDelivery\Queue;
use Pinenut\Queue\ProcessingQueue;


class MessageReadAction extends Worker {

	/**
	 * Создает уведомления для всех онлайн-собеседников группы о приходе нового сообщения
	 *
	 * @param ProcessingQueue $item - элемент очереди
	 * @return bool
	 */
	public function process(ProcessingQueue $item)
	{
		# Извлекаем из элемента очереди id группы переписки
		$groupId = (string)$item->data['groupId'];

		# Извлекаем из элемента очереди id профиля пользователя, прочитавшего сообщение
		$readerId = (string)$item->data['readerId'];

		# Пытаемся загрузить модель группы переписки
		/** @var Groups $groupModel */
		$groupModel = Groups::find($groupId);

		# Если группа не найдена в бд - прекращаем обработку уведомления
		if ($groupModel === null) {
			\Log::msg('Группа "' . $groupId . '" не найдена в БД');
			return false;
		}

		# Формируем список получателей уведомления, удаляя из него пользователя, прочитавшего сообщение
		unset ($groupModel->relations[$readerId]);
		$groupUserIds  = [];
		foreach ($groupModel->relations as $userId => $relation) {
			$groupUserIds[] = $userId;
		}

		/** @var Messages[] $unreadMessages */
		$unreadMessages = $groupModel->getUnreadMessages($groupUserIds);

		foreach ((array)$unreadMessages as $message) {
			$message->isReaded(true);
			$message->save();
		}

		# Для каждого получателя формируем новое уведомление с типом "На отправку"
		foreach ($groupUserIds as $userId) {
			# Добавляем в очередь новое уведомление
			Queue::enqueue(
				[
					'type' => \NotificationDeliveryConfig::TYPE_SEND_TO_RECEIVER,
					'subscriber' => $userId,
					'data' => [
						'eventName' => 'messengerMessageRead',
						'eventData' => $item->data,
					],
				]
			);
		}

		return true;
	}
}